home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-PPC / MMU.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  11KB  |  295 lines

  1. /*
  2.  * PowerPC memory management structures
  3.  */
  4.  
  5. #ifndef _PPC_MMU_H_
  6. #define _PPC_MMU_H_
  7.  
  8. #ifndef __ASSEMBLY__
  9. /* Hardware Page Table Entry */
  10. typedef struct _PTE {
  11.     unsigned long v:1;    /* Entry is valid */
  12.     unsigned long vsid:24;    /* Virtual segment identifier */
  13.     unsigned long h:1;    /* Hash algorithm indicator */
  14.     unsigned long api:6;    /* Abbreviated page index */
  15.     unsigned long rpn:20;    /* Real (physical) page number */
  16.     unsigned long    :3;    /* Unused */
  17.     unsigned long r:1;    /* Referenced */
  18.     unsigned long c:1;    /* Changed */
  19.     unsigned long w:1;    /* Write-thru cache mode */
  20.     unsigned long i:1;    /* Cache inhibited */
  21.     unsigned long m:1;    /* Memory coherence */
  22.     unsigned long g:1;    /* Guarded */
  23.     unsigned long  :1;    /* Unused */
  24.     unsigned long pp:2;    /* Page protection */
  25. } PTE; 
  26.  
  27. /* Values for PP (assumes Ks=0, Kp=1) */
  28. #define PP_RWXX    0    /* Supervisor read/write, User none */
  29. #define PP_RWRX 1    /* Supervisor read/write, User read */
  30. #define PP_RWRW 2    /* Supervisor read/write, User read/write */
  31. #define PP_RXRX 3    /* Supervisor read,       User read */
  32.  
  33. /* Segment Register */
  34. typedef struct _SEGREG {
  35.     unsigned long t:1;    /* Normal or I/O  type */
  36.     unsigned long ks:1;    /* Supervisor 'key' (normally 0) */
  37.     unsigned long kp:1;    /* User 'key' (normally 1) */
  38.     unsigned long n:1;    /* No-execute */
  39.     unsigned long :4;    /* Unused */
  40.     unsigned long vsid:24;    /* Virtual Segment Identifier */
  41. } SEGREG;
  42.  
  43. /* Block Address Translation (BAT) Registers */
  44. typedef struct _P601_BATU {    /* Upper part of BAT for 601 processor */
  45.     unsigned long bepi:15;    /* Effective page index (virtual address) */
  46.     unsigned long :8;    /* unused */
  47.     unsigned long w:1;
  48.     unsigned long i:1;    /* Cache inhibit */
  49.     unsigned long m:1;    /* Memory coherence */
  50.     unsigned long ks:1;    /* Supervisor key (normally 0) */
  51.     unsigned long kp:1;    /* User key (normally 1) */
  52.     unsigned long pp:2;    /* Page access protections */
  53. } P601_BATU;
  54.  
  55. typedef struct _BATU {        /* Upper part of BAT (all except 601) */
  56.     unsigned long bepi:15;    /* Effective page index (virtual address) */
  57.     unsigned long :4;    /* Unused */
  58.     unsigned long bl:11;    /* Block size mask */
  59.     unsigned long vs:1;    /* Supervisor valid */
  60.     unsigned long vp:1;    /* User valid */
  61. } BATU;   
  62.  
  63. typedef struct _P601_BATL {    /* Lower part of BAT for 601 processor */
  64.     unsigned long brpn:15;    /* Real page index (physical address) */
  65.     unsigned long :10;    /* Unused */
  66.     unsigned long v:1;    /* Valid bit */
  67.     unsigned long bl:6;    /* Block size mask */
  68. } P601_BATL;
  69.  
  70. typedef struct _BATL {        /* Lower part of BAT (all except 601) */
  71.     unsigned long brpn:15;    /* Real page index (physical address) */
  72.     unsigned long :10;    /* Unused */
  73.     unsigned long w:1;    /* Write-thru cache */
  74.     unsigned long i:1;    /* Cache inhibit */
  75.     unsigned long m:1;    /* Memory coherence */
  76.     unsigned long g:1;    /* Guarded (MBZ in IBAT) */
  77.     unsigned long :1;    /* Unused */
  78.     unsigned long pp:2;    /* Page access protections */
  79. } BATL;
  80.  
  81. typedef struct _BAT {
  82.     BATU batu;        /* Upper register */
  83.     BATL batl;        /* Lower register */
  84. } BAT;
  85.  
  86. typedef struct _P601_BAT {
  87.     P601_BATU batu;        /* Upper register */
  88.     P601_BATL batl;        /* Lower register */
  89. } P601_BAT;
  90.  
  91. /*
  92.  * Simulated two-level MMU.  This structure is used by the kernel
  93.  * to keep track of MMU mappings and is used to update/maintain
  94.  * the hardware HASH table which is really a cache of mappings.
  95.  *
  96.  * The simulated structures mimic the hardware available on other
  97.  * platforms, notably the 80x86 and 680x0.
  98.  */
  99.  
  100. typedef struct _pte {
  101.        unsigned long page_num:20;
  102.        unsigned long flags:12;        /* Page flags (some unused bits) */
  103. } pte;
  104.  
  105. #define PD_SHIFT (10+12)        /* Page directory */
  106. #define PD_MASK  0x02FF
  107. #define PT_SHIFT (12)            /* Page Table */
  108. #define PT_MASK  0x02FF
  109. #define PG_SHIFT (12)            /* Page Entry */
  110.  
  111.  
  112. /* MMU context */
  113.  
  114. typedef struct _MMU_context {
  115.     SEGREG    segs[16];    /* Segment registers */
  116.     pte    **pmap;        /* Two-level page-map structure */
  117. } MMU_context;
  118.  
  119. /* invalidate a TLB entry */
  120. extern inline void _tlbie(unsigned long va)
  121. {
  122.     asm volatile ("tlbie %0" : : "r"(va));
  123. }
  124.  
  125. extern void _tlbia(void);        /* invalidate all TLB entries */
  126.  
  127. #endif /* __ASSEMBLY__ */
  128.  
  129. /* Block size masks */
  130. #define BL_128K    0x000
  131. #define BL_256K 0x001
  132. #define BL_512K 0x003
  133. #define BL_1M   0x007
  134. #define BL_2M   0x00F
  135. #define BL_4M   0x01F
  136. #define BL_8M   0x03F
  137. #define BL_16M  0x07F
  138. #define BL_32M  0x0FF
  139. #define BL_64M  0x1FF
  140. #define BL_128M 0x3FF
  141. #define BL_256M 0x7FF
  142.  
  143. /* BAT Access Protection */
  144. #define BPP_XX    0x00        /* No access */
  145. #define BPP_RX    0x01        /* Read only */
  146. #define BPP_RW    0x02        /* Read/write */
  147.  
  148. /* Used to set up SDR1 register */
  149. #define HASH_TABLE_SIZE_64K    0x00010000
  150. #define HASH_TABLE_SIZE_128K    0x00020000
  151. #define HASH_TABLE_SIZE_256K    0x00040000
  152. #define HASH_TABLE_SIZE_512K    0x00080000
  153. #define HASH_TABLE_SIZE_1M    0x00100000
  154. #define HASH_TABLE_SIZE_2M    0x00200000
  155. #define HASH_TABLE_SIZE_4M    0x00400000
  156. #define HASH_TABLE_MASK_64K    0x000   
  157. #define HASH_TABLE_MASK_128K    0x001   
  158. #define HASH_TABLE_MASK_256K    0x003   
  159. #define HASH_TABLE_MASK_512K    0x007
  160. #define HASH_TABLE_MASK_1M    0x00F   
  161. #define HASH_TABLE_MASK_2M    0x01F   
  162. #define HASH_TABLE_MASK_4M    0x03F   
  163.  
  164. /* Control/status registers for the MPC8xx.
  165.  * A write operation to these registers causes serialized access.
  166.  * During software tablewalk, the registers used perform mask/shift-add
  167.  * operations when written/read.  A TLB entry is created when the Mx_RPN
  168.  * is written, and the contents of several registers are used to
  169.  * create the entry.
  170.  */
  171. #define MI_CTR        784    /* Instruction TLB control register */
  172. #define MI_GPM        0x80000000    /* Set domain manager mode */
  173. #define MI_PPM        0x40000000    /* Set subpage protection */
  174. #define MI_CIDEF    0x20000000    /* Set cache inhibit when MMU dis */
  175. #define MI_RSV4I    0x08000000    /* Reserve 4 TLB entries */
  176. #define MI_PPCS        0x02000000    /* Use MI_RPN prob/priv state */
  177. #define MI_IDXMASK    0x00001f00    /* TLB index to be loaded */
  178. #define MI_RESETVAL    0x00000000    /* Value of register at reset */
  179.  
  180. /* These are the Ks and Kp from the PowerPC books.  For proper operation,
  181.  * Ks = 0, Kp = 1.
  182.  */
  183. #define MI_AP        786
  184. #define MI_Ks        0x80000000    /* Should not be set */
  185. #define MI_Kp        0x40000000    /* Should always be set */
  186.  
  187. /* The effective page number register.  When read, contains the information
  188.  * about the last instruction TLB miss.  When MI_RPN is written, bits in
  189.  * this register are used to create the TLB entry.
  190.  */
  191. #define MI_EPN        787
  192. #define MI_EPNMASK    0xfffff000    /* Effective page number for entry */
  193. #define MI_EVALID    0x00000200    /* Entry is valid */
  194. #define MI_ASIDMASK    0x0000000f    /* ASID match value */
  195.                     /* Reset value is undefined */
  196.  
  197. /* A "level 1" or "segment" or whatever you want to call it register.
  198.  * For the instruction TLB, it contains bits that get loaded into the
  199.  * TLB entry when the MI_RPN is written.
  200.  */
  201. #define MI_TWC        789
  202. #define MI_APG        0x000001e0    /* Access protection group (0) */
  203. #define MI_GUARDED    0x00000010    /* Guarded storage */
  204. #define MI_PSMASK    0x0000000c    /* Mask of page size bits */
  205. #define MI_PS8MEG    0x0000000c    /* 8M page size */
  206. #define MI_PS512K    0x00000004    /* 512K page size */
  207. #define MI_PS4K_16K    0x00000000    /* 4K or 16K page size */
  208. #define MI_SVALID    0x00000001    /* Segment entry is valid */
  209.                     /* Reset value is undefined */
  210.  
  211. /* Real page number.  Defined by the pte.  Writing this register
  212.  * causes a TLB entry to be created for the instruction TLB, using
  213.  * additional information from the MI_EPN, and MI_TWC registers.
  214.  */
  215. #define MI_RPN        790
  216.  
  217. /* Define an RPN value for mapping kernel memory to large virtual
  218.  * pages for boot initialization.  This has real page number of 0,
  219.  * large page size, shared page, cache enabled, and valid.
  220.  * Also mark all subpages valid and write access.
  221.  */
  222. #define MI_BOOTINIT    0x000001fd
  223.  
  224. #define MD_CTR        792    /* Data TLB control register */
  225. #define MD_GPM        0x80000000    /* Set domain manager mode */
  226. #define MD_PPM        0x40000000    /* Set subpage protection */
  227. #define MD_CIDEF    0x20000000    /* Set cache inhibit when MMU dis */
  228. #define MD_WTDEF    0x10000000    /* Set writethrough when MMU dis */
  229. #define MD_RSV4I    0x08000000    /* Reserve 4 TLB entries */
  230. #define MD_TWAM        0x04000000    /* Use 4K page hardware assist */
  231. #define MD_PPCS        0x02000000    /* Use MI_RPN prob/priv state */
  232. #define MD_IDXMASK    0x00001f00    /* TLB index to be loaded */
  233. #define MD_RESETVAL    0x04000000    /* Value of register at reset */
  234.  
  235. #define M_CASID        793    /* Address space ID (context) to match */
  236. #define MC_ASIDMASK    0x0000000f    /* Bits used for ASID value */
  237.  
  238.  
  239. /* These are the Ks and Kp from the PowerPC books.  For proper operation,
  240.  * Ks = 0, Kp = 1.
  241.  */
  242. #define MD_AP        794
  243. #define MD_Ks        0x80000000    /* Should not be set */
  244. #define MD_Kp        0x40000000    /* Should always be set */
  245.  
  246. /* The effective page number register.  When read, contains the information
  247.  * about the last instruction TLB miss.  When MD_RPN is written, bits in
  248.  * this register are used to create the TLB entry.
  249.  */
  250. #define MD_EPN        795
  251. #define MD_EPNMASK    0xfffff000    /* Effective page number for entry */
  252. #define MD_EVALID    0x00000200    /* Entry is valid */
  253. #define MD_ASIDMASK    0x0000000f    /* ASID match value */
  254.                     /* Reset value is undefined */
  255.  
  256. /* The pointer to the base address of the first level page table.
  257.  * During a software tablewalk, reading this register provides the address
  258.  * of the entry associated with MD_EPN.
  259.  */
  260. #define M_TWB        796
  261. #define    M_L1TB        0xfffff000    /* Level 1 table base address */
  262. #define M_L1INDX    0x00000ffc    /* Level 1 index, when read */
  263.                     /* Reset value is undefined */
  264.  
  265. /* A "level 1" or "segment" or whatever you want to call it register.
  266.  * For the data TLB, it contains bits that get loaded into the TLB entry
  267.  * when the MD_RPN is written.  It is also provides the hardware assist
  268.  * for finding the PTE address during software tablewalk.
  269.  */
  270. #define MD_TWC        797
  271. #define MD_L2TB        0xfffff000    /* Level 2 table base address */
  272. #define MD_L2INDX    0xfffffe00    /* Level 2 index (*pte), when read */
  273. #define MD_APG        0x000001e0    /* Access protection group (0) */
  274. #define MD_GUARDED    0x00000010    /* Guarded storage */
  275. #define MD_PSMASK    0x0000000c    /* Mask of page size bits */
  276. #define MD_PS8MEG    0x0000000c    /* 8M page size */
  277. #define MD_PS512K    0x00000004    /* 512K page size */
  278. #define MD_PS4K_16K    0x00000000    /* 4K or 16K page size */
  279. #define MD_WT        0x00000002    /* Use writethrough page attribute */
  280. #define MD_SVALID    0x00000001    /* Segment entry is valid */
  281.                     /* Reset value is undefined */
  282.  
  283.  
  284. /* Real page number.  Defined by the pte.  Writing this register
  285.  * causes a TLB entry to be created for the data TLB, using
  286.  * additional information from the MD_EPN, and MD_TWC registers.
  287.  */
  288. #define MD_RPN        798
  289.  
  290. /* This is a temporary storage register that could be used to save
  291.  * a processor working register during a tablewalk.
  292.  */
  293. #define M_TW        799
  294. #endif /* _PPC_MMU_H_ */
  295.